;
(function ($) {
    /*
     * TD 中如果是纯文本，则用td.data来赋值给td;其他使用平台空间
     * colModel定义
     *  radio,checkbox,delete,button 用config
     *  其他用 renderer
     * */
    $.omWidget('om.omTable', {
        options:{
            colModel:false,
            rowClasses:['oddRow', 'evenRow']
        },
        _create:function () {
            var tbl = this.element.show().addClass("gridtable");
            if (tbl.find("tbody").length > 0) {
                tbl.find("tbody").remove();
            }

            tbl.append('<tbody/>');
            this.tbody = this.element.find("tbody");

            var options = this.options;
            if (!$.isArray(options.colModel)) {
                return; //如果colModel没设置或值不对，什么也不做
            } else {
                var thSize = $("thead tr:eq(0) th",this.element).length;
                if (options.colModel.length != thSize) {
                    alert($el.attr("id") + " colModel size not equal Table th size");
                }
            }
        },
        _init:function () {
        },
        destroy:function(){
            //2013.3.8 由于外界jquery对象如果在remove时会调用destroy方法,因此此方法内部暂时不做任何处理
            //var $el = this.element;
            //$el.closest('.gridtable').after($el).remove();
        },
        _isEmpty:function (v) {
            return v === null || v === undefined || v === '';
        },
        _getTdVal:function ($td) {
            if ('data' == $td.attr('data')) {
                return $td.data('data');//如果td包含data属性,就取data值
            } else {
                return $td.find(".icss_base").omValue();
            }
        },
        _setTdVal:function ($td, rowdata) {
            var opt = this.options;
            var colName = $td.attr("colName");
            if (!this._isEmpty(colName)) {
                var colVal = rowdata[colName];
                var colModels = opt.colModel;
                var colModel = null;//取出当前td对应的colModel
                for (var i = 0; i < colModels.length; i++) {
                    if (colModels[i].name == colName) {
                        colModel = colModels[i];
                        break;
                    }
                }
                //根据colModel定义,对td进行赋值 TODO 自行的列值赋值定义
                var colType = colModel.type;
                switch (colType) {
                    case 'text':
                        $td.attr('data', 'data').data('data', colVal).text(colVal);
                        break;
                    case 'doubletext':
                        if (isNaN(colVal)) {
                            colVal = 0;
                        }
                        $td.attr('data', 'data').data('data', colVal).text($.omNumberField.commafy(colVal, true));
                        break;
                    case 'textfield':
                        $td.find(".icss_text").omValue(colVal);
                        break;
                    case 'numberfield':
                        $td.find(".icss_number").omValue(colVal);
                        break;
                    case 'datefield':
                        $td.find(".icss_date").omValue(colVal);
                        break;
                    case 'comboxfield':
                        $td.find(".icss_combox").omValue(colVal);
                        break;
                    case 'combox2field':
                        $td.find(".icss_combox2").omValue(colVal);
                        break;
                    case 'combox3field':
                        $td.find(".icss_combox3").omValue(colVal);
                        break;
                    case 'checkbox':
                        $td.find(".icss_checkbox").val(colVal);
                        break;
                    case 'radio':
                        $td.find(".icss_radio").val(colVal);
                        break;
                    case 'self' :
                        if ($.isPlainObject(colModel.renderer)) {
                            if ($.isFunction(colModel.renderer.setTdVal)) {
                                colModel.renderer.setTdVal($td, colVal);
                            }
                        }
                        break;
                    default:
                        break;
                }
            } else {
                //如果没有属性名，就不对这列进行赋值
            }
        },

        setCellData:function (i, c, val) {
            var $tr = this.tbody.find("tr").eq(i);
            var $td = $tr.find("td").eq(c);
            var colName = $td.attr("colName");
            var record = {};
            record[colName] = val;
            this._setTdVal($td, record);
        },

        //给tbody某行赋值,index从0开始
        setRowData:function (index, rowdata) {
            var self = this;
            var $tr = this.tbody.find("tr").eq(index).attr("data", "data").data("data", rowdata);
            //遍历每个td，按照名称将rowdata赋值给td内的元素
            $tr.find("td").each(function () {
                var $td = $(this);
                self._setTdVal($td, rowdata);
            });
        },

        //创建一行,如果输入rowdata不为空,则顺带赋值
        addRow:function (rowdata, index, callback) {
            //规范index不能为负数和0
            if (index != null && index <= 0) {
                alert('can not insert into 0;index must more than 0');
                return;
            }

            var $el = this.element, opt = this.options;
            var $tr = $("<tr></tr>").attr("data", "data").data("data", rowdata);

            var colModels = opt.colModel;
            for (var i = 0; i < colModels.length; i++) {
                //循环列定义,创建每个td
                var colModel = colModels[i];
                var $td = $("<td></td>")
                    .attr("colName", colModel.name)
                    .css("text-align", this._isEmpty(colModel["align"]) ? "center" : colModel["align"]);
                var width = colModel.width;
                var $input = $("<input type='text'/>");

                if (!this._isEmpty(width)) {
                    $input.css('width', width + 'px');
                }

                var colType = colModel.type;
                //初始化td内的控件
                switch (colType) {
                    case 'delete' :
                        var colModelTmp = colModel;
                        $("<span></span>").text(colModel.buttonname).addClass("delspan")
                            .click(function () {
                                var tr = $(this).parent().parent();
                                var index = tr.index();
                                var rowdata = tr.data('data');
                                tr.remove();
                                if ($.isPlainObject(colModelTmp.config)) {
                                    if ($.isFunction(colModelTmp.config.callback)) {
                                        colModelTmp.config.callback(index, rowdata);
                                    }
                                }
                            }).appendTo($td);
                        break;
                    case 'textfield':
                        $td.append($input);//必须先append，再初始化
                        ICSS.textfield($input);
                        break;
                    case 'numberfield':
                        $td.append($input);//必须先append，再初始化
                        ICSS.numberfield($input);
                        break;
                    case 'datefield':
                        $td.append($input);//必须先append，再初始化
                        ICSS.datefield($input);
                        break;
                    case 'comboxfield':
                        if (this._isEmpty(colModel.combox)) {
                            alert('missing combox id');
                            return;
                        }
                        $input.attr('combox', colModel.combox);
                        $td.append($input);//必须先append，再初始化
                        ICSS.comboxfield($input);
                        break;

                    case 'combox2field':
                        if (this._isEmpty(colModel.combox)) {
                            alert('missing combox id');
                            return;
                        }
                        $input.attr('combox', colModel.combox);
                        $td.append($input);//必须先append，再初始化
                        ICSS.combox2field($input);
                        break;

                    case 'combox3field':
                        if (this._isEmpty(colModel.combox)) {
                            alert('missing combox id');
                            return;
                        }
                        $input.attr('combox', colModel.combox);
                        $td.append($input);//必须先append，再初始化
                        ICSS.combox3field($input);
                        break;
                    case  'button':
                        var $input = $("<input type='button' class='icss_button'>").attr('value', colModel.buttonname);
                        $td.append($input);

                        var config = [];
                        if ($.isArray(colModel.config)) {
                            config = colModel.config;
                        } else if ($.isPlainObject(colModel.config)) {
                            config = [colModel.config];
                        }

                        for (var j = 0; j < config.length; j++) {
                            var cfg = config[j];
                            $input.bind(cfg.event, function () {
                                cfg.fn(rowdata)
                            });
                        }
                        break;
                    case 'checkbox' :
                        var tid = $el.attr('id');
                        var $input = $("<input type='checkbox' class='icss_base icss_checkbox'>").attr('name', tid + "_checkbox");
                        $td.append($input);
                        var config = [];
                        if ($.isArray(colModel.config)) {
                            config = colModel.config;
                        } else if ($.isPlainObject(colModel.config)) {
                            config = [colModel.config];
                        }
                        for (var j = 0; j < config.length; j++) {
                            var cfg = config[j];
                            $input.bind(cfg.event, function () {
                                cfg.fn(rowdata,$(this));
                            });
                        }
                        break;
                    case 'radio' :
                        var tid = $el.attr('id');
                        var $input = $("<input type='radio' class='icss_base icss_radio'>").attr('name', tid + "_radio");
                        $td.append($input);
                        var config = [];
                        if ($.isArray(colModel.config)) {
                            config = colModel.config;
                        } else if ($.isPlainObject(colModel.config)) {
                            config = [colModel.config];
                        }

                        for (var j = 0; j < config.length; j++) {
                            var cfg = config[j];
                            $input.bind(cfg.event, function () {
                                cfg.fn(rowdata)
                            });
                        }
                        break;
                    case 'self' :
                        //自定义td内内容，暂时没有特殊处理,主要依靠公共renderer来处理
                        break;
                    default:
                        //其他不处理
                        break;
                }

                if ($.isPlainObject(colModel.renderer)) {
                    if ($.isFunction(colModel.renderer.addTd)) {
                        var tdhtml = colModel.renderer.addTd($td, rowdata);
                        if (!this._isEmpty(tdhtml)) {
                            $td.html(tdhtml);
                        }
                    }
                    if ($.isFunction(colModel.renderer.callback)) {
                        colModel.renderer.callback($td, rowdata);
                    }
                }

                if (colModel.required) {
                    //TODO 需要判断控件类型,如果都parent可能有问题
                    $input.parent().after("<font color='red'>*</font>");
                }
                $tr.append($td);
            }

            //计算插入行号,注意此值不能传递给方法,因为指定的行号不是最终的行号
            var insertIndex = null;
            if (!this._isEmpty(index)) {
                var lastIndex = $("tr:last", this.tbody).index();
                if (lastIndex < 0) {
                    //如果一行都没有,就向最后插入
                    insertIndex = null;
                } else {
                    if (index == 1) {
                        insertIndex = 0;//向第一行插入
                    } else {
                        if ((index - 1) > lastIndex) {
                            insertIndex = lastIndex;
                        } else {
                            insertIndex = index - 1;
                        }
                    }
                }

            }

            if (this._isEmpty(insertIndex) || insertIndex < 0) {
                //直接在最后一行插入tr
                this.tbody.append($tr);
                insertIndex = $tr.index();
            } else if (insertIndex == 0) {
                //插入到第0行
                $("tr:first", this.tbody).before($tr);
                insertIndex = 0;
            } else {
                //从指定插入行之前一行下面 插入tr
                this.tbody.find("tr").eq(insertIndex).before($tr);
            }

            //给此行赋值
            if ($.isPlainObject(rowdata)) {
                this.setRowData(insertIndex, rowdata);
            }

            //输出tr后回调事件
            if ($.isFunction(callback)) {
                callback($tr);
            }
        },

        setData:function (ary) {
            for (var i = 0; i < ary.length; i++) {
                this.addRow(ary[i]);
            }
        },

        getData:function () {
            var self = this,
                opt = this.options,
                $el = this.element;
            var datas = [];
            $el.find("tbody tr").each(function () {
                var $tr = $(this);
                var colModels = opt.colModel;
                var record = $tr.data('data');
                for (var i = 0; i < colModels.length; i++) {
                    var colModel = colModels[i];
                    var colName = colModel.name;
                    var $td = $tr.find("td").eq(i);
                    if (colModel.type == 'self') {
                        if ($.isFunction(colModel.renderer.getTdVal)) {
                            delete record[colName];
                            record[colName] = colModel.renderer.getTdVal($tr.index(), $td);
                        }
                    } else {
                        delete record[colName];
                        record[colName] = self._getTdVal($td);
                    }
                }
                datas.push(record);
            });
            return datas;
        },

        getRowData:function(i){
            var self = this,
                opt = this.options,
                $el = this.element;
            var $tr = $el.find("tbody tr").eq(i);
            var colModels = opt.colModel;
            var record = $tr.data('data');
            for (var i = 0; i < colModels.length; i++) {
                var colModel = colModels[i];
                var colName = colModel.name;
                var $td = $tr.find("td").eq(i);
                if (colModel.type == 'self') {
                    if ($.isFunction(colModel.renderer.getTdVal)) {
                        record[colName] = colModel.renderer.getTdVal($tr.index(), $td);
                    }
                } else {
                    record[colName] = self._getTdVal($td);
                }
            }
            return record;
        },

        getSelections:function () {
        },

        hideTd:function (c, hide) {
            this.element.find("thead tr").each(function(){
                var tr = $(this);
                var td = tr.find("th").eq(c);
                hide ? td.hide() : td.show();
            });
            this.element.find("tbody tr").each(function(){
                var tr = $(this);
                var td = tr.find("td").eq(c);
                hide ? td.hide() : td.show();
            });
        }
    });
})(jQuery);